Norris enjoyed a late-race pace advantage over Verstappen out front but was unable to bridge the gap after losing time in the opening stint.
That came courtesy of Mercedes’ George Russell, though it was Lewis Hamilton who completed the podium.
Oscar Piastri was seventh to the line in the second McLaren while Daniel Ricciardo improved from 18th on the grid to 15th at the flag.
Norris swept across from the start, pushing Verstappen onto the grass and opening the door for Russell to sweep around the outside of the pair to take the lead.
Verstappen slotted into second as Norris slipped from pole to third, while Oscar Piastri climbed a place at the expense of Esteban Ocon to end the opening lap eighth.
At the start of Lap 3, the race had its third leader with Verstappen passing Russell into Turn 1.
The Red Bull Racing driver had DRS down the front straight, and while the Mercedes driver moved to defend into Turn 1 there was nothing he could do to keep the championship leader at bay.
Once ahead, he quickly extended a 1.1s advantage to leave himself clear of DRS range.
A scrap developed between the two Ferraris, Carlos Sainz passing Charles Leclerc into Turn 1 with the two scarlet cars making contact in the process.
That saw Sainz take to the escape road, rejoining but maintaining fifth in an incident reviewed by the stewards, who deemed there was no further action necessary.
After 10 laps, Verstappen held a 2.1s advantage over Russell, with Norris third from Lewis Hamilton, Sainz, Leclerc, Pierre Gasly, and Piastri.
The Australian was locked onto the gearbox of the Alpine ahead which was clearly holding him up.
Sergio Perez and Ocon boxed at the end of Lap 14, opening a window into which McLaren could feed Norris in an attempt to undercut Russell ahead.
While the team discussed the concept with its driver over the radio, it did not call him in.
Mercedes responded with Russell, releasing the McLaren behind. It was a slow stop, the Brit emerging almost side-by-side with Sainz who’d boxed at the same time.
Verstappen was called in from the lead after 17 laps, Norris remaining on track to regain the lead he’d held briefly at the race start.
The Red Bull driver fed back in fourth on road, Norris, Leclerc, and Piastri ahead still yet to take service.
A battle between Hamilton and Sainz was resolved in the former’s favour at the start of Lap 19.
The pair were side-by-side into Turn 1, Hamilton on the inside as they made light contact in a what was a firm move, but one noted by officials.
Piastri dived for the pits after 21 laps, swapping his soft compound tyres for hards as he rejoined behind the Haas of Nico Hulkenberg in 11th.
While he’d lost track position, the 23-year-old had a strong tyre advantage and made short work of Hulkenberg to move back into the top 10.
Norris was in a similar position in the race lead, poised to drop behind Sainz as a result of staying out but with a tyre delta that, the team hoped, would serve him well.
The pole sitter stopped at the end of Lap 22, rejoining into free air behind Sainz in sixth – effectively fifth with Leclerc still yet to stop.
The Monegasque did so at the end of Lap 24, taking on a set of medium tyres as he rejoined between the two Alpines in seventh.
That completed the opening sequence of stops, however with a wide spread in terms of tyre delta.
Norris used that to quickly close on Sainz, claiming fourth place into Turn 1 as they began Lap 27.
The McLaren soon chased down Hamilton but found the Mercedes more difficult to clear than the Ferrari, finally managing it at the start of Lap 32.
He then rounded Russell for second on Lap 35, the pair running wheel to wheel through Turn 3 and Turn 4, Norris finally sealing the deal at Turn 6.
Verstappen led the race by 9.3s over Norris, Russell, Hamilton, Sainz, Leclerc, and Piastri after 36 laps.
Russell boxed at the end of the lap, moving onto a set of hard tyres as Sainz too pitted, kicking off the second – and final – round of stops.
In second, Norris was on a charge as he began to take chunks out of Verstappen’s lead, reducing what was a 9.3s advantage to just over four seconds after 43 laps.
That drew the race leader into the pits at the end of Lap 44, bolting on a brand new set of soft compound tyres.
Norris immediately improved his pace to a 1:18.754s as he worked to extend his stint to hold a stronger tyre advantage for a late charge as, unlike Verstappen, he didn’t have a new set of soft tyres in his locker.
Piastri boxed after 46 laps, a lap prior to his race-leading team-mate.
It was a 3.6s stationary time for Norris which saw him feed out side by side with Russell into Turn 1.
Crucially, he remained ahead of Russell to remain second as he was the last driver to pit for a second time.
That left Verstappen leading by 7.7s from Norris with Russell third, Hamilton fourth, then Sainz and Leclerc, with Perez seventh and Piastri down to eighth.
On a three-stop strategy, Perez took service for the final time at the end of Lap 50, dropping to 10th behind Gasly and Ocon as Piastri rose to seventh.
The two Mercedes drivers swapped positions at the start of Lap 52, Hamilton going around the outside in the first corner as he climbed to third.
Verstappen’s lead was being eroded, his advantage reducing to 5.5s at the end of Lap 54.
The Dutchman responded and Norris’ charge began to slow. He was 4.9s at the end of Lap 57, necessitating a six-tenth a lap advantage at a time he was gaining only half of that.
It proved a bridge too far, Verstappen holding on to win from Norris by two seconds with Hamilton in third a further 15s back.
Russell withstood a late push from Leclerc to maintain fourth from the Ferrari driver, whose team-mate Sainz was sixth.
Piastri saw the flag seventh ahead of Perez, Gasly, and Ocon rounded out the top 10.
A late pass on Valtteri Bottas left Ricciardo 15th after 66 laps of racing, while Yuki Tsunoda was 19th after a three-stop strategy that came with a post-race time penalty for pit lane speeding.